package com.example.jrfwcwgl.entity;

import java.math.BigDecimal;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import java.time.LocalDateTime;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import java.util.Date;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springframework.format.annotation.DateTimeFormat;

/**
 * <p>
 * 支付订单表（支付流水信息）
 * </p>
 *
 * @author 龚梦
 * @since 2021-04-08
 */
@Data
@EqualsAndHashCode(callSuper = false)
public class TCwPayOrder implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 主键id
     */
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;

    /**
     * 支付订单号
     */
    private String orderNo;

    /**
     * 交易账户：更改为相关商户名称
     */
    private String tradeAccount;

    /**
     * 交易账户类型：暂定1:微信，2:支付宝，3:银行卡，4:拉卡拉（微信扫码和H5都是微信，支付宝扫码就是支付宝，认证就是银行卡，提现的时候是拉卡拉）
     */
    private Integer tradeAccountType;

    /**
     * 交易账号（出端的账号：如果是快捷支付：银行卡号，如果是支付宝微信扫码支付，因为取不到微信或者支付宝账号，拉卡拉返回的charge对象里面会返回一个发起支付的IP地址，所以暂定就用这个IP地址。提现的时候：拉卡拉的企业账户）
     */
    private String tradeAccountNo;

    /**
     * 用户ID：根据类型来判断是哪种客户的ID(不一定是登录客户，而是这笔交易的对象)	租客付款的时候，是租客，企业充值提现是企业businessid
     */
    private Long userId;

    /**
     * 交易涉及用户类型：1：租客个人用户（前端客户），2：企业商户（businessID）
     */
    private Integer userType;

    /**
     * 操作类型：1：充值（企业充值），2：提现（企业提现），3：收款（企业收款计划），4：付款（企付款款计划）
     */
    private Integer operationType;

    /**
     * 支付方式, 1:微信扫码，2:支付宝扫码，3:微信公众号，4:认证支付，5:实时代付到银行卡，20:批量代付到银行卡
     */
    private Integer payWay;

    /**
     * 订单金额：支付订单金额
     */
    private BigDecimal amount;

    /**
     * 支付金额：用来记录用户实际支付金额，目前=订单金额就行。
     */
    private BigDecimal payAmount;

    /**
     * 结算金额：平台这边定义字段，暂时不设值，拉卡拉对账文件里面也会有，存到导入的表里面，对账的时候显示拉卡拉那边的结算金额
     */
    private BigDecimal finalAmount;

    /**
     * 优惠金额， 预留字段
     */
    private BigDecimal discountAmount;

    /**
     * 交易对手：入金(提现以外)的时候：海链物联，出金（提现）的时候是商户名称。
     */
    private String tradeUser;

    /**
     * 对手账号：入金的时候：海链的拉卡拉账号，出的时候是商户对应银行卡号（目前只有提现）。
     */
    private String dsAccount;

    /**
     * 交易渠道：暂时固定拉卡拉。
     */
    private String tradeQudao;

    /**
     * 渠道订单号：拉卡拉生成的订单号，具体什么时候回传需要调查。
     */
    private String qudaoOrderNo;

    /**
     * 交易结果：接口回调或者返回的结果 1:处理中，2:成功，3:失败。
     */
    private Integer tradeResult;

    /**
     * 返回码：系统记录，界面不展示。(充值或提现失败时的错误码)
     */
    private String returnCode;

    /**
     * 返回信息(充值或提现失败时的错误消息)
     */
    private String returnMsg;

    /**
     * 发起交易日期：调用拉卡拉下单时间。
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date tradeDateFq;

    /**
     * 执行交易日期：确认支付时间（认证支付的时候，输完三要素，确认支付按钮按下的时间，也即最后一次掉拉卡拉接口时间），扫码的时候因为是用户主动付款，不经过平台获取不到该时间，故没有不显示。
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date tradeDateZx;

    /**
     * 渠道支付时间：回调告诉系统处理结果的时间，如果回调参数里面没有就取系统时间。
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date tradeDateZf;

    /**
     * 支付截止日期：订单有效时间计算，二维码三分钟，H5因为是系统通知微信，所以自己传的时间，没穿就是空。其它都是1小时。根据发起交易日期来计算。
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date tradeDateJz;

    /**
     * 费率, 预留字段
     */
    private BigDecimal tradeRate;

    /**
     * 手续费, 预留字段
     */
    private BigDecimal commissionFee;

    /**
     * 开始时间，设定为记录创建时间，作为业务开始时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date beginTime;

    /**
     * 结束时间，最后一次业务处理时间，比如支付回调以后
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date endTime;

    /**
     * 审核状态：1=待审核，2=审核通过，3=审核不通过，100=系统自动审核，预留字段，暂时自动设置为100
     */
    private Integer checkState;

    /**
     * 审核时间，预留字段，暂时自动设置为记录创建的系统时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date checkTime;

    /**
     * 审核用户ID
     */
    @TableField("check_userId")
    private String checkUserid;

    /**
     * 审核失败原因
     */
    private String checkFailReason;

    /**
     * 外部订单号：微信/支付宝/银联的交易号，预留字段，目前同渠道订单号，暂时不设置
     */
    private String outOrderNo;

    /**
     * 对账状态：1=未对账，2=已对账，3=待结算，4=已结算
     */
    private Integer dzState;

    /**
     * 记账凭证：支付接口回调更新支付状态的时候：已记账的才参与对账。交易流水号+100（未记账）（自动） 交易流水号+101（已记账）（自动）交易流水号+111（已记账）（手动）
     */
    private String certificateJz;

    /**
     * 商品信息
     */
    private String productSubject;

    /**
     * 商品信息
     */
    private String productBody;

    /**
     * 商户可结算金额（入金的时候，可以结算给商户虚拟账户的金额，比如商户充值金额，租户缴费金额，对账和结算时候用, 为0的时候，表示没有结算金额。	如果该笔费用不是结算给商户的，比如有租约保理的房租，则该笔费用不包含在可结算金额中。）
     */
    private BigDecimal canClearingAmount;

    /**
     * 备注
     */
    private String remarks;

    /**
     * 预留字段1
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date reserve1;

    /**
     * 预留字段2
     */
    private Integer reserve2;

    /**
     * 预留字段3
     */
    private String reserve3;

    /**
     * 预留字段4
     */
    private String reserve4;

    /**
     * 预留字段5
     */
    private String reserve5;

    /**
     * 删除标识。0:未删除，1：删除
     */
    private Boolean delFlg;

    /**
     * 创建用户ID
     */
    private Long createUserid;

    /**
     * 创建时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date createTime;

    /**
     * 更新用户ID
     */
    private Long updateUserid;

    /**
     * 更新时间
     */
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date updateTime;


}
